package in.lib.handler.streams; import in.lib.Constants; import in.lib.Debug; import in.lib.handler.base.WidgetResponseHandler; import in.lib.manager.CacheManager; import in.lib.writer.MultiFileCacheWriter; import in.model.Post; import in.model.Stream; import in.obj.StreamMarker; import android.content.Context; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; /** * Standard response handler for Post streams. * * Use {@link #getPosts()} in {@link #onCallback()} to get the returned posts */ public abstract class WidgetPostStreamResponseHandler extends WidgetResponseHandler { public WidgetPostStreamResponseHandler(Context c, String cacheFile) { super(c, cacheFile); } @Override public void onSuccess() { JsonElement elements = getContent(); if (elements != null) { MultiFileCacheWriter cacheWriter = new MultiFileCacheWriter(); try { JsonArray jPosts = elements.getAsJsonObject().get("data").getAsJsonArray(); int size = jPosts.size(); for (int index = 0; index < size; index++) { JsonObject post = jPosts.get(index).getAsJsonObject(); Post p = new Post().createFrom(post); // something wrong happened (maybe a deletion) if (p == null) continue; getObjects().add(p); cacheWriter.scheduleAsyncWrite(String.format(Constants.CACHE_USER, p.getPoster().getId()), p.getPoster()); } if (elements.getAsJsonObject().has("meta")) { JsonObject meta = elements.getAsJsonObject().get("meta").getAsJsonObject(); if (meta.has("max_id")) { setFirstId(meta.get("max_id").getAsString()); } else if (getObjects().size() > 0) { setFirstId(getObjects().get(0).getId()); } if (meta.has("min_id")) { setLastId(meta.get("min_id").getAsString()); } else if (getObjects().size() > 0) { setLastId(getObjects().get(getObjects().size() - 1).getId()); } if (meta.has("more")) { setHasMore(meta.get("more").getAsBoolean()); } setMarker(StreamMarker.fromObject(meta)); } } catch (Exception e) { Debug.out(getConnectionInfo()); e.printStackTrace(); } cacheWriter.executeAsyncWriteList(); Stream s = new Stream(); s.setObjects(getObjects()); s.setMarker(getMarker()); s.setHasMore(getHasMore()); s.setMaxId(getFirstId()); s.setMinId(getLastId()); CacheManager.getInstance().writeFile(getCacheFileName(), s); onCallback(); } else { onFinish(true); } } @Override public void onFailure() { Debug.out(getConnectionInfo()); } /** * Implement this callback and use {@link #getPosts()} to get the returned List of posts * For fragments, use onCallback to execute {@link RobinFragment.runWhenReady()} and pass <b>this</b> * Then override {@link #run()} to finish the adapter stuff. * * See also: {@link #getHasMore()}, {@link #getLastId()} */ public abstract void onCallback(); }